Skip to content

feat(desktop,host-service): add right-click import of untracked worktrees - #6097

Merged
Kitenite merged 1 commit into
mainfrom
import-untracked-worktree
Aug 1, 2026
Merged

Kitenite merged 1 commit into
mainfrom
import-untracked-worktree

Conversation

@Kitenite

@Kitenite Kitenite commented Aug 1, 2026 •

Copy link
Copy Markdown
Member

What

Adds an Import untracked worktrees action to the project right-click menu in the v2 sidebar. It lists every git worktree of the project's repo that has no workspace row and imports them as workspaces via the existing workspaces.create adopt path (no git worktree add).

Clicking the menu item opens a confirmation dialog showing the count and the list (branch + path) of worktrees that will be imported, plus a Run setup script checkbox that defaults to off — imported worktrees are usually already set up.

How

  • host-service workspaceCreation.listProjectWorktrees: entries now carry hasWorkspace (workspace row matches by branch — the canonical tracking key — or by realpath-normalized path, catching rows whose branch was renamed) and isMainWorktree (never offer the main repo checkout). Additive, so the v1→v2 importer callers are unaffected.
  • host-service workspaces.create: new optional runSetup input; false skips the setup terminal. All existing callers omit it, so behavior is unchanged for them. Old hosts strip the unknown key and keep today's behavior.
  • desktop: new ImportWorktreesDialog (borderless rows matching the V1 ImportRow pattern, truncation with title tooltips, max-h-64 scroll with overscroll-contain); the menu action fetches the untracked list and opens it; confirm submits each via useWorkspaceCreates().submit with runSetup, so optimistic sidebar rows, pane layout, and failure cleanup are handled by the existing pipeline. Re-running when everything is tracked toasts instead of opening the dialog; adoption is idempotent server-side.

Verification

CDP-driven end-to-end against the dev app from this branch (instance ownership + session verified):

  • Right-click → menu item → dialog with correct count/list; long branch names truncate; 8-row list scrolls.
  • Confirm with checkbox off: workspaces created for exactly the untracked worktrees (main repo excluded), and a sentinel-writing .superset/setup.sh did not run.
  • Confirm with checkbox on: sentinel files written in each imported workspace — setup ran.
  • Re-run: "All of this project's worktrees are already tracked" toast, no new rows.
  • bun run lint, monorepo typecheck, and host-service workspace-creation/workspaces suites (incl. the main-loop-blocking ratchet) all green.

Summary by cubic

Add a right-click “Import untracked worktrees” action in the v2 desktop sidebar to adopt existing git worktrees as workspaces, with an optional setup step. This avoids creating new worktrees and makes adoption quick and safe.

  • New Features
    • desktop: Project context menu gains “Import untracked worktrees,” opening a dialog that lists each untracked worktree (branch + path) and a “Run setup script” checkbox (off by default). If none are untracked, a toast is shown; otherwise, each is created via the existing create flow with optimistic UI; main checkout is excluded.
    • host-service: workspaceCreation.listProjectWorktrees now includes hasWorkspace (matched by branch or normalized path) and isMainWorktree to support filtering.
    • host-service: workspaces.create accepts optional runSetup; when false, the setup terminal is skipped. Existing callers are unchanged; older hosts ignore unknown input.

Written for commit ac905b7. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added support for importing untracked worktrees directly from the project sidebar.
    • Review available branches and paths before importing them as workspaces.
    • Optionally run setup scripts during import.
    • Import actions are available in both expanded and collapsed project menus.
  • Bug Fixes
    • Improved worktree detection to distinguish existing workspaces from the main repository and avoid duplicate imports.

…rees

- Project context menu gains 'Import untracked worktrees', opening a
  confirmation dialog listing each orphan worktree (branch + path) with
  an opt-in 'Run setup script' checkbox (off by default)
- listProjectWorktrees now annotates entries with hasWorkspace (matched
  by branch or normalized path) and isMainWorktree
- workspaces.create gains an optional runSetup flag; false skips the
  setup terminal (import default)
@coderabbitai

coderabbitai Bot commented Aug 1, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The dashboard sidebar now discovers untracked worktrees, displays them for confirmation, and imports selected worktrees as workspaces. Imports can optionally skip setup scripts. The host service identifies main and already tracked worktrees.

Changes

Worktree import

Layer / File(s) Summary
Worktree discovery
packages/host-service/src/trpc/router/workspace-creation/procedures/list-project-worktrees.ts
The procedure marks worktrees as main repositories or already associated with workspaces. It normalizes paths before comparison.
Workspace creation option
packages/host-service/src/trpc/router/workspaces/workspaces.ts
Workspace creation accepts runSetup. Setup commands are skipped when this option is false.
Import orchestration
apps/desktop/.../DashboardSidebarProjectSection/hooks/.../useDashboardSidebarProjectSectionActions.ts
The hook finds eligible worktrees, creates workspaces, reports outcomes, clears state, and prevents concurrent imports.
Import confirmation dialog
apps/desktop/.../components/ImportWorktreesDialog/*
The dialog lists branches and paths, supports setup-script selection, and disables actions while importing.
Sidebar integration
apps/desktop/.../DashboardSidebarProjectSection/*, apps/desktop/.../DashboardSidebarProjectContextMenu.tsx
Both project layouts expose “Import untracked worktrees” and render the dialog.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant Sidebar
  participant ActionsHook
  participant HostService
  participant ImportDialog
  participant WorkspaceService
  User->>Sidebar: Select import action
  Sidebar->>ActionsHook: Discover worktrees
  ActionsHook->>HostService: listProjectWorktrees
  HostService-->>ActionsHook: Return eligible worktrees
  ActionsHook->>ImportDialog: Show candidates
  User->>ImportDialog: Confirm import
  ImportDialog->>ActionsHook: Submit candidates and runSetup
  ActionsHook->>WorkspaceService: Create workspaces
  WorkspaceService-->>ActionsHook: Return import outcomes
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title uses conventional commit format and clearly describes the main feature: importing untracked worktrees from the project context menu.
Description check ✅ Passed The description explains the feature, implementation, rationale, and detailed verification, but it omits the repository checklist.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch import-untracked-worktree

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 1, 2026 •

Copy link
Copy Markdown
Contributor

🧹 Preview Cleanup Complete

The following preview resources have been cleaned up:

  • ✅ Neon database branch

Thank you for your contribution! 🎉

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/host-service/src/trpc/router/workspaces/workspaces.ts (1)

744-777: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Guard concurrent imports before they run unlockeds create work. The desktop import flow submits every untracked worktree with Promise.all, and those requests arrive at the input.worktreePath branch without a create lock. The PR path protects this with acquireWorkspaceCreateLock; this path needs the same or documented concurrency safety.

Add a per-project or per-repo guard around the worktreePath block (ensureMainWorkspace, git.worktree prune, adoptExistingWorktree, and enablePushAutoSetupRemote), or throttle the desktop bulk submission to one in-flight request per project while the host-side path proves safe.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/host-service/src/trpc/router/workspaces/workspaces.ts` around lines
744 - 777, Protect concurrent worktree imports by adding the existing
per-project or per-repository create guard around the host-side worktreePath
flow in packages/host-service/src/trpc/router/workspaces/workspaces.ts, covering
ensureMainWorkspace, git.worktree prune, adoptExistingWorktree, and
enablePushAutoSetupRemote; preserve the guard through the entire operation and
release it reliably. In
apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts,
the bulk submission site requires no direct change if the host-side guard is
implemented; otherwise throttle submissions to one in-flight request per
project.
🧹 Nitpick comments (1)
apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts (1)

138-223: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider adding hook-level tests for the import flow.

handleImportWorktrees and confirmImportWorktrees contain non-trivial async logic: filtering, concurrent submission, outcome aggregation, and re-entrancy guarding. No test file accompanies this hook. Adding tests for the untracked-filter, the partial-failure aggregation, and the concurrent-guard would reduce regression risk for this new flow.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts`
around lines 138 - 223, The import flow lacks hook-level coverage for its key
async behaviors. Add tests for useDashboardSidebarProjectSectionActions,
covering handleImportWorktrees filtering only eligible untracked non-main
worktrees, confirmImportWorktrees aggregating concurrent submission outcomes
with partial failures, and both methods’ re-entrancy guards preventing duplicate
work.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts`:
- Around line 202-216: Update the partial-failure toast in the worktree import
action around the outcomes/error aggregation to surface more than errors[0].
Include the failure count or combine distinct error messages so users can see
details for all failed imports while preserving the existing success behavior.

---

Outside diff comments:
In `@packages/host-service/src/trpc/router/workspaces/workspaces.ts`:
- Around line 744-777: Protect concurrent worktree imports by adding the
existing per-project or per-repository create guard around the host-side
worktreePath flow in
packages/host-service/src/trpc/router/workspaces/workspaces.ts, covering
ensureMainWorkspace, git.worktree prune, adoptExistingWorktree, and
enablePushAutoSetupRemote; preserve the guard through the entire operation and
release it reliably. In
apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts,
the bulk submission site requires no direct change if the host-side guard is
implemented; otherwise throttle submissions to one in-flight request per
project.

---

Nitpick comments:
In
`@apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts`:
- Around line 138-223: The import flow lacks hook-level coverage for its key
async behaviors. Add tests for useDashboardSidebarProjectSectionActions,
covering handleImportWorktrees filtering only eligible untracked non-main
worktrees, confirmImportWorktrees aggregating concurrent submission outcomes
with partial failures, and both methods’ re-entrancy guards preventing duplicate
work.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5da38ee1-9717-4726-a63f-cedb8be2d355

📥 Commits

Reviewing files that changed from the base of the PR and between 7e97ded and ac905b7.

📒 Files selected for processing (7)
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/DashboardSidebarProjectSection.tsx
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/components/DashboardSidebarProjectContextMenu/DashboardSidebarProjectContextMenu.tsx
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/components/ImportWorktreesDialog/ImportWorktreesDialog.tsx
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/components/ImportWorktreesDialog/index.ts
  • apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts
  • packages/host-service/src/trpc/router/workspace-creation/procedures/list-project-worktrees.ts
  • packages/host-service/src/trpc/router/workspaces/workspaces.ts

Comment on lines +202 to +216
const errors = outcomes.flatMap((outcome) =>
outcome.ok ? [] : [outcome.error],
);
const imported = outcomes.length - errors.length;
if (errors.length > 0) {
toast.error(
`Imported ${imported} of ${untracked.length} worktrees: ${errors[0]}`,
);
} else {
toast.success(
imported === 1
? "Imported 1 worktree as a workspace"
: `Imported ${imported} worktrees as workspaces`,
);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Surface more than the first error on partial import failure.

When several worktrees fail for different reasons, errors[0] hides every failure except the first. Users cannot tell whether the other failures share the same cause.

Include the failure count or join distinct error messages instead of showing only the first one.

💬 Proposed fix to surface more failure detail
 			if (errors.length > 0) {
+				const uniqueErrors = [...new Set(errors)];
 				toast.error(
-					`Imported ${imported} of ${untracked.length} worktrees: ${errors[0]}`,
+					`Imported ${imported} of ${untracked.length} worktrees: ${uniqueErrors.join("; ")}`,
 				);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const errors = outcomes.flatMap((outcome) =>
outcome.ok ? [] : [outcome.error],
);
const imported = outcomes.length - errors.length;
if (errors.length > 0) {
toast.error(
`Imported ${imported} of ${untracked.length} worktrees: ${errors[0]}`,
);
} else {
toast.success(
imported === 1
? "Imported 1 worktree as a workspace"
: `Imported ${imported} worktrees as workspaces`,
);
}
const errors = outcomes.flatMap((outcome) =>
outcome.ok ? [] : [outcome.error],
);
const imported = outcomes.length - errors.length;
if (errors.length > 0) {
const uniqueErrors = [...new Set(errors)];
toast.error(
`Imported ${imported} of ${untracked.length} worktrees: ${uniqueErrors.join("; ")}`,
);
} else {
toast.success(
imported === 1
? "Imported 1 worktree as a workspace"
: `Imported ${imported} worktrees as workspaces`,
);
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts`
around lines 202 - 216, Update the partial-failure toast in the worktree import
action around the outcomes/error aggregation to surface more than errors[0].
Include the failure count or combine distinct error messages so users can see
details for all failed imports while preserving the existing success behavior.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 7 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts">

<violation number="1" location="apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts:153">
P2: On hosts that predate the new `hasWorkspace`/`isMainWorktree` fields, `worktree.hasWorkspace === false` is `false` because the field is `undefined`, so the list is treated as fully tracked and users get the 'All of this project's worktrees are already tracked' toast. That message is misleading because the real cause is host-version incompatibility, not zero untracked worktrees. Consider detecting the old-host case (e.g., no worktree carries the new fields) and showing a dedicated 'update your host' message instead of a false 'all tracked' success toast.</violation>
</file>
Architecture diagram
sequenceDiagram
    actor User
    participant Sidebar as Sidebar UI
    participant Menu as Project Context Menu
    participant Dialog as Import Worktrees Dialog
    participant Hook as useDashboardSidebarProjectSectionActions
    participant Store as useWorkspaceCreates
    participant Client as Host Service Client
    participant Host as Host Service tRPC
    participant Git as Git Worktree List
    participant DB as Workspaces DB
    participant Setup as Setup Terminal

    User->>Sidebar: Right-click project
    Sidebar->>Menu: Open context menu
    User->>Menu: Click "Import untracked worktrees"
    Menu->>Hook: handleImportWorktrees()

    alt No serving host URL
        Hook-->>User: Toast: host unreachable
    else Host reachable
        Hook->>Client: workspaceCreation.listProjectWorktrees.query({ projectId })
        Client->>Host: tRPC query listProjectWorktrees
        Host->>Git: listGitWorktrees()
        Git-->>Host: worktree records
        Host->>DB: SELECT workspaces WHERE projectId
        DB-->>Host: workspace rows
        Host->>Host: Annotate hasWorkspace by branch/path + isMainWorktree
        Host-->>Client: { worktrees }
        Client-->>Hook: worktrees
        Hook->>Hook: Filter untracked worktrees

        alt No untracked worktrees
            Hook-->>User: Toast: all worktrees already tracked
        else Untracked worktrees exist
            Hook->>Dialog: Open with branch + path list
            User->>Dialog: Optionally check "Run setup script"
            User->>Dialog: Confirm import
            Dialog->>Hook: onConfirm({ runSetup })
            Hook->>Hook: Set importing state

            loop For each untracked worktree
                Hook->>Store: submit({ snapshot: { projectId, branch, worktreePath, runSetup } })
                Store->>Client: workspaces.create mutation
                Client->>Host: tRPC create workspace
                Host->>DB: Create workspace row for worktreePath

                alt runSetup !== false
                    Host->>Setup: Start setup terminal
                    Setup-->>Host: setup completes
                else runSetup === false
                    Note over Host,Setup: Run setup skipped for already-set-up worktree
                end

                Host-->>Client: result
                Client-->>Store: outcome
                Store-->>Hook: completed
            end

            Hook->>Hook: Aggregate outcomes
            alt All imports succeeded
                Hook-->>User: Toast: Imported N worktrees
            else Some imports failed
                Hook-->>User: Toast: Imported X of Y + first error
            end

            Hook->>Dialog: Close
        end
    end
Loading

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

projectId: project.id,
});
// `=== false` also skips hosts too old to report tracked-ness.
const untracked = worktrees.filter(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: On hosts that predate the new hasWorkspace/isMainWorktree fields, worktree.hasWorkspace === false is false because the field is undefined, so the list is treated as fully tracked and users get the 'All of this project's worktrees are already tracked' toast. That message is misleading because the real cause is host-version incompatibility, not zero untracked worktrees. Consider detecting the old-host case (e.g., no worktree carries the new fields) and showing a dedicated 'update your host' message instead of a false 'all tracked' success toast.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/DashboardSidebar/components/DashboardSidebarProjectSection/hooks/useDashboardSidebarProjectSectionActions/useDashboardSidebarProjectSectionActions.ts, line 153:

<comment>On hosts that predate the new `hasWorkspace`/`isMainWorktree` fields, `worktree.hasWorkspace === false` is `false` because the field is `undefined`, so the list is treated as fully tracked and users get the 'All of this project's worktrees are already tracked' toast. That message is misleading because the real cause is host-version incompatibility, not zero untracked worktrees. Consider detecting the old-host case (e.g., no worktree carries the new fields) and showing a dedicated 'update your host' message instead of a false 'all tracked' success toast.</comment>

<file context>
@@ -124,6 +133,94 @@ export function useDashboardSidebarProjectSectionActions({
+				projectId: project.id,
+			});
+			// `=== false` also skips hosts too old to report tracked-ness.
+			const untracked = worktrees.filter(
+				(worktree) =>
+					worktree.hasWorkspace === false && worktree.isMainWorktree === false,
</file context>

@Kitenite
Kitenite merged commit 958f0c7 into main Aug 1, 2026
19 checks passed
Kitenite added a commit that referenced this pull request Aug 5, 2026
* docs: weekly update for PRs merged 2026-07-29 to 2026-08-05

- tasks.mdx: Tasks and Pull requests are now separate sidebar destinations
  with independent persisted filters; GitHub Issues as a Tasks source (#5975)
- workspaces.mdx: prompt history popover (#6083), typed-name-seeds-branch
  behavior (#6129), right-click import of untracked worktrees (#6097),
  bulk workspace actions section (#6021)
- automations.mdx: inline Retry and Retry all for failed runs (#6139)
- keyboard-shortcuts.mdx: Open Command Palette ⌘⇧K and Check Resources ⌘⇧U (#6037)
- setup-teardown-scripts.mdx: experimental wait-for-setup-before-agents
  setting (#5925)

* docs(recipes): add agent-driven Superset recipe for the shipped superset:* skills

Covers the workflow from #6181: standup, automate, doctor, setup,
feedback, and orchestrate driven from the agent you're already in.

* docs(recipes): focus agent-driven recipe on orchestrate and automate, defer to skills page

* docs(recipes): defer orchestrate teaching to its page, center recipe on the automate arc

* docs: address review — branch name is slugified, retry scoping, Linear source wording

This branch was previously deployed

1 inactive deployment
preview — ac905b7c Deployed Aug 1, 2026 by Kitenite via Deploy API #6984
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant